import { Session } from '@renderer/utils/storage'
import { defineStore } from 'pinia'
import { getUserInfo, login, refreshTokenApi } from '@renderer/api/login/index'

/**
 * @function useUserInfo
 * @returns {UserInfosStore}
 */
export const useUserInfo = defineStore('userInfo', {
  state: (): UserInfosState => ({
    userInfos: {
      username: '',
      nickname: '',
      //是否登录
      isLogin: false
    }
  }),
  persist: true, // 启用持久化

  actions: {
    /**
     * 登录方法
     * @function login
     * @async
     * @param {Object} data - 登录数据
     * @returns {Promise<Object>}
     */
    async login(data: any) {
      data.grant_type = 'password'
      data.scope = 'server'

      return new Promise((resolve, reject) => {
        login(data)
          .then((res) => {
            console.log('login获取token后，存储token信息' + res.access_token)
            // 存储token 信息
            Session.set('token', res.access_token)
            Session.set('refresh_token', res.refresh_token)

            // 将 Promise 的状态变为 fulfilled（已解决），并将 res 作为结果传递给后续的 .then() 回调函数。
            resolve(res)
          })
          .catch((err) => {
            console.log('login获取token后，存储token信息异常' + err.msg)
            // useMessage().error(err?.msg || '系统异常请联系管理员');
            // 将 Promise 的状态变为 rejected（被拒绝），并将 err 作为原因传递给后续的 .catch() 回调函数。
            reject(err)
          })
      })
    },

    /**
     * 刷新token方法
     * @function refreshToken
     * @async
     * @returns {Promise<any>}
     */
    async refreshToken() {
      return new Promise((resolve, reject) => {
        const refreshToken = Session.get('refresh_token')
        refreshTokenApi(refreshToken)
          .then((res) => {
            // 存储token 信息
            Session.set('token', res.access_token)
            Session.set('refresh_token', res.refresh_token)
            resolve(res)
          })
          .catch((err) => {
            // useMessage().error(err.msg);
            alert(err.msg)
            reject(err)
          })
      })
    },

    /**
     * 获取用户信息方法
     * @function setUserInfos
     * @async
     */
    async setUserInfos() {
      await getUserInfo().then((res) => {
        const userInfo: any = {
          nickname: res.data.nickname,
          username: res.data.username,
          isLogin: true
        }
        this.userInfos = userInfo
      })
    }
  }
})
